### 面向对象的三大特性：封装、继承、多态
=begin
在这里我将定义一个支付类（pay class），然后再定义订单（order）、账单（bill）、预订单（pre_order）继承pay类
pay类
应具有的属性：
1.app_id：应用标识符，用于标识支付服务提供商中的应用。
2.merchant_id：商户标识符，用于标识支付服务提供商中的商户。
3.order_no：订单编号，用于标识具体的支付订单。
4.amount：支付金额，表示要支付的金额数值。
5.currency：货币类型，表示支付金额使用的货币种类。
6.subject：订单主题，用于描述订单的内容和目的。
7.body：订单详情，用于描述订单的详细信息。
8.return_url：支付完成后的返回地址，用于将用户重定向到支付完成页面。
9.notify_url：支付通知地址，用于接收支付回调（callback）通知。
应具有的方法：
1.初始化方法
2.发起支付请求
3.生成支付订单
4.发起退款请求
5.取消支付请求
6.支付通知方法
=end

class Pay
  attr_accessor :app_id, :merchant_id, :order_no, :amount, :currency, :subject, :body, :return_url, :notify_url
  
  def initialize(app_id, merchant_id, order_no, amount, currency, subject, body, return_url, notify_url)
    @app_id = app_id
    @merchant_id = merchant_id
    @order_no = order_no
    @amount = amount
    @currency = currency
    @subject = subject
    @body = body
    @return_url = return_url
    @notify_url = notify_url
  end
  
  private :app_id 
  protected :body
  def request_payment
    puts "pay request payment"
    # 向支付服务提供商发送支付请求
    # 并返回相应的结果
  end
  
  def parse_response(response_data)
    # 解析支付服务提供商返回的支付响应
    # 并将其转换为 Ruby 对象或其他数据格式
  end
  
  def request_refund(refund_amount)
    # 向支付服务提供商发送退款请求
    # 并返回相应的结果
  end
  
  def request_cancel
    # 向支付服务提供商发送取消支付请求
    # 并返回相应的结果
  end
  
  def handle_callback(callback_data)
    # 接收支付回调（callback）通知
    # 并将其解析成 Ruby 对象或其他数据格式
  end

  ####################
  # 类方法
  def self.sayHello()
    puts "this is a pay class"
  end
  # to_s方法
  def to_s 
    "<^_^>: init data =>
    @app_id : #@app_id
    @merchant_id : #@merchant_id
    @order_no : #@order_no
    @amount : #@amount
    @currency : #@currency
    @subject : #@subject
    @body : #@body
    @return_url : #@return_url
    @notify_url : #@notify_url
    "
  end
end

class Order < Pay
  puts "hello world"
  def self.sayHello()
    puts "this is a order class"
  end
  def request_payment
    puts "order request payment"
  end
end
puts Pay.new("appid001", "id001", "order001", 100, "RMB", "wechat pay", "hello world", "http://www.pay.com", "http://www.pay.com").app_id = "pid001"
pay = Pay.new("appid001", "id001", "order001", 100, "RMB", "wechat pay", "hello world", "http://www.pay.com", "http://www.pay.com")
puts Pay.sayHello()
puts "reload to_s function: #{pay}"
puts pay.request_payment
puts Order.sayHello()
order = Pay.new("appid001", "id001", "order001", 100, "RMB", "wechat pay", "hello world", "http://www.pay.com", "http://www.pay.com")
puts order.request_payment

pay.freeze
if(pay.frozen?)
  puts "pay object is freeze !"
else puts "pay object normal freeze !"
end